#!/bin/bash

# 雷达系统用户级自启动设置脚本（无需root权限）

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 工作目录
WORK_DIR="/home/admin1/lidar"

# 设置用户级自启动（使用crontab）
setup_user_autostart() {
    log_step "设置用户级自启动..."
    
    # 创建启动脚本
    cat > "$WORK_DIR/autostart.sh" << 'EOF'
#!/bin/bash

# 雷达系统自启动脚本
WORK_DIR="/home/admin1/lidar"
LOG_FILE="$WORK_DIR/logs/autostart.log"

# 创建日志目录
mkdir -p "$WORK_DIR/logs"

# 记录启动时间
echo "$(date): 系统启动，准备启动雷达服务..." >> "$LOG_FILE"

# 等待网络就绪
sleep 30

# 切换到工作目录
cd "$WORK_DIR"

# 启动服务
./start_services.sh start >> "$LOG_FILE" 2>&1

echo "$(date): 雷达服务启动完成" >> "$LOG_FILE"
EOF
    
    chmod +x "$WORK_DIR/autostart.sh"
    
    # 添加到用户crontab（开机启动）
    (crontab -l 2>/dev/null | grep -v "autostart.sh"; echo "@reboot $WORK_DIR/autostart.sh") | crontab -
    
    log_info "用户级自启动设置成功！"
}

# 设置健康检查任务
setup_health_check() {
    log_step "设置健康检查任务..."
    
    # 创建健康检查脚本
    cat > "$WORK_DIR/health_check.sh" << 'EOF'
#!/bin/bash

# 雷达系统健康检查脚本
WORK_DIR="/home/admin1/lidar"
LOG_FILE="$WORK_DIR/logs/health_check.log"

# 检查端口是否被占用
check_port() {
    local port=$1
    if netstat -tlnp 2>/dev/null | grep ":$port " > /dev/null; then
        return 0  # 端口被占用
    else
        return 1  # 端口空闲
    fi
}

# 记录日志
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S'): $1" >> "$LOG_FILE"
}

# 检查服务状态
if ! check_port 5000 || ! check_port 7100; then
    log_message "检测到服务异常，尝试重启"
    
    # 切换到工作目录
    cd "$WORK_DIR"
    
    # 重启服务
    ./start_services.sh restart >> "$LOG_FILE" 2>&1
    
    log_message "服务重启完成"
else
    log_message "服务运行正常"
fi
EOF
    
    chmod +x "$WORK_DIR/health_check.sh"
    
    # 添加到用户crontab（每5分钟检查一次）
    (crontab -l 2>/dev/null | grep -v "health_check.sh"; echo "*/5 * * * * $WORK_DIR/health_check.sh") | crontab -
    
    log_info "健康检查任务设置成功！"
}

# 创建便捷管理脚本
create_management_scripts() {
    log_step "创建便捷管理脚本..."
    
    # 创建快速启动脚本
    cat > "$WORK_DIR/quick_start.sh" << 'EOF'
#!/bin/bash
cd /home/admin1/lidar
./start_services.sh start
EOF
    
    # 创建快速停止脚本
    cat > "$WORK_DIR/quick_stop.sh" << 'EOF'
#!/bin/bash
cd /home/admin1/lidar
./start_services.sh stop
EOF
    
    # 创建快速状态检查脚本
    cat > "$WORK_DIR/quick_status.sh" << 'EOF'
#!/bin/bash
cd /home/admin1/lidar
./start_services.sh status
EOF
    
    chmod +x "$WORK_DIR/quick_start.sh"
    chmod +x "$WORK_DIR/quick_stop.sh"
    chmod +x "$WORK_DIR/quick_status.sh"
    
    log_info "便捷管理脚本创建成功！"
}

# 显示设置结果
show_setup_result() {
    log_step "自启动设置完成！"
    
    echo ""
    echo "=== 自启动配置 ==="
    echo "✅ 用户级开机自启: @reboot cron任务"
    echo "✅ 健康检查: 每5分钟自动检查并重启异常服务"
    echo "✅ 监控守护进程: 每30秒检查服务状态"
    echo ""
    
    echo "=== 便捷管理命令 ==="
    echo "快速启动: ./quick_start.sh"
    echo "快速停止: ./quick_stop.sh"
    echo "快速状态: ./quick_status.sh"
    echo "完整管理: ./service_manager.sh"
    echo ""
    
    echo "=== 详细管理命令 ==="
    echo "启动服务: ./start_services.sh start"
    echo "停止服务: ./start_services.sh stop"
    echo "重启服务: ./start_services.sh restart"
    echo "查看状态: ./start_services.sh status"
    echo ""
    
    echo "=== 日志文件 ==="
    echo "后端服务: $WORK_DIR/logs/backend.log"
    echo "监控守护: $WORK_DIR/logs/watchdog.log"
    echo "自启动: $WORK_DIR/logs/autostart.log"
    echo "健康检查: $WORK_DIR/logs/health_check.log"
    echo ""
    
    echo "=== 访问地址 ==="
    echo "🌐 主要前端: http://192.168.15.125:5000"
    echo "🌐 备用前端: http://192.168.15.125:8080"
    echo "📡 API接口: http://192.168.15.125:5000/test"
    echo ""
    
    echo "=== 当前cron任务 ==="
    crontab -l 2>/dev/null || echo "无cron任务"
    echo ""
    
    log_info "🎉 现在可以安全关闭VSCode！"
    log_info "🚀 服务将在后台持续运行，并在系统重启后自动启动"
    log_info "💪 服务崩溃后会自动重启，确保系统稳定运行"
}

# 主函数
main() {
    log_info "雷达系统用户级自启动设置程序"
    log_info "工作目录: $WORK_DIR"
    
    # 设置各种自启动和监控
    setup_user_autostart
    setup_health_check
    create_management_scripts
    
    # 显示结果
    show_setup_result
}

# 执行主函数
main "$@"
